#include <iostream>
/**
 * @brief 练习调用方法之后改变自身方法内部本地变量的用法。结论是是如果传入的是int，char * 等值类型，编译器默认会进行拷贝
 *        所以要传入指向本地变量类型的地址才可以
 * 
 */
void out_num0(int o0) {
    using namespace std;
    cout << "o0: address: " << &o0 << endl;
    o0 = o0 + 10;
}

void out_num1(int *o1) {
    using namespace std;
    cout << "o1: address: " << o1 << endl;
    *o1 = *o1 + 10;
}

void test_int()
{
    int local_out = 10;
    using namespace std;
    cout << "out: address: " << &local_out << endl;
    out_num0(local_out);
    out_num1(&local_out);
    /**
     * 输出的内容是:
     * out: address: 0x16bb230a8
        o0: address: 0x16bb2307c
        o1: address: 0x16bb230a8
        从中可以看出，如果使用int o0作为参数时，编译器会将main函数本地的变量拷贝一份然后进入out_num0函数，这样out_num0函数改变的变量其实就是另外一份变量，不是本地变量
        如果使用int *o1作为参数时，传入函数的其实是main函数本地变量的地址，通过这个地址可以操作其value值
     */
}

void out_put_char(char *out) {
    using namespace std;
    cout << "out's address: " << &out << endl;
    out = "result";
}

void out_put_char1(char **out) {
    using namespace std;
    cout << "out1's address: " << out << endl;
    *out = "result";
}

void test_str() {
    char *a_str = "hello world";
    using namespace std;
    cout << "a_str's address: " << &a_str << endl;
    out_put_char(a_str);
    out_put_char1(&a_str);
    cout << "out string:" << a_str << endl;
    /**
     * 输出的内容是:
     * a_str's address: 0x16d29b088
        out's address: 0x16d29b058
        out1's address: 0x16d29b088
        out string:result
     * 从中可以看出字符串【char *】直接传入方法时，其也会被拷贝一份，所以对其更改是无效的
       而如果要改变其指向的内容则需要直接传入其地址
     */
}

int main_test_out_put()
{
    // test_int();
    test_str();
    return 0;
}